package com.credithc.fastdfs.api.validator;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.credithc.fastdfs.api.config.SystemConfig;
import com.credithc.fastdfs.api.entity.FdfsInfo;
import com.credithc.fastdfs.api.entity.FileType;
import com.credithc.fastdfs.api.mapper.SystemAreaMapper;
import com.credithc.fastdfs.api.service.FileTypeService;
import com.credithc.fastdfs.api.util.Validation;

/**
 * 附件校验器
 * @author liujiasong
 * @date 2015年5月14日
 * @time 上午10:25:56 
 */
@Service("annexValidatorImpl")
public class AnnexValidatorImpl implements AnnexValidator{
	
	@Resource(name="fileTypeServiceImpl")
	public FileTypeService fileTypeServiceImpl;
	
	@Autowired
	public SystemAreaMapper systemAreaMapper;
	
	/**
	 * 校验附件限制
	 * 包括：附件后缀、附件大小
	 * @author liujiasong
	 * @date 2015年5月14日
	 * @time 上午10:30:01 
	 * @param object
	 * @param typeFlag 类型标识
	 * @return
	 */
	public  Map<String,Object> validateAnnex(FdfsInfo fdfsInfo,String typeFlag){
		Map<String,Object> map = new HashMap<String, Object>();
		Boolean validate=false;
		String msg = "";
		if(StringUtils.indexOf(fdfsInfo.getFileName(), ".") == -1) {
			map.put("success", validate);
			map.put("msg", "原始文件名错误");
			return map;
		}
		if(StringUtils.isBlank(fdfsInfo.getSystemId()) || fdfsInfo.getSystemId().length() > 50) {
			map.put("success", validate);
			map.put("msg", "应用系统ID错误");
			return map;
		} else {
			int m = systemAreaMapper.getCountBySysFlag(fdfsInfo.getSystemId());//校验系统ID是否存在
			if(m < 1) {
				map.put("success", validate);
				map.put("msg", "应用系统ID错误");
				return map;
			}
		}
		if(StringUtils.isNotEmpty(fdfsInfo.getBusinessId()) && fdfsInfo.getBusinessId().length() > 100) {
			map.put("success", validate);
			map.put("msg", "业务ID错误");
			return map;
		}
		if(StringUtils.isNotBlank(fdfsInfo.getSlaveName()) && fdfsInfo.getSlaveName().length() > 500) {
			map.put("success", validate);
			map.put("msg", "从文件错误");
			return map;
		}
		
		FileType fileType=fileTypeServiceImpl.queryFileType(typeFlag);
		if(fileType!=null){
			//校验文件后缀类型
			String[] str = fileType.getSuffixLimit().toLowerCase().split(",");
			String fileSuffix = fdfsInfo.getFileName().substring(fdfsInfo.getFileName().lastIndexOf(".") + 1);
			int index=ArrayUtils.indexOf(str, fileSuffix.toLowerCase());
			if(index<0){
				msg=fileType.getTypeName()+"只能上传"+fileType.getSuffixLimit()+"类型！";
				map.put("success", validate);
				map.put("msg", msg);
				return map;
			}
			//校验文件大小
			if(fdfsInfo.getFileSize()>fileType.getSizeLimit()){
				msg=fileType.getTypeName()+"不能大于"+fileType.getSizeLimit().toString()+"！";
				map.put("success", validate);
				map.put("msg", msg);
				return map;
			}
			if (StringUtils.equalsIgnoreCase(fdfsInfo.getFileType(),
					SystemConfig.SLAVE_TYPE_IMG)
					&& StringUtils.isNotEmpty(fdfsInfo.getSlaveName())) {// 缩略图及裁剪坐标校验
				String items[] = fdfsInfo.getSlaveName().split(",");//文件处理拆分
				for (String item : items) {
					String zoom[] = item.split(SystemConfig.PHOTO_SPLIT_ZOOM);//缩放格式拆分
					String cut[] = item.split(SystemConfig.PHOTO_SPLIT_COORD_POINT);//裁剪格式拆分
					if(zoom.length == 2) {//缩放操作
						if (!Validation.validate(zoom[0], Validation.INT)
								|| !Validation.validate(zoom[1], Validation.INT)) {
							map.put("success", validate);
							map.put("msg", "缩略参数不正确 ["+item+"]");
							return map;
						}
					} else if(cut.length == 2) {//裁剪操作
						String xy[] = cut[0].split(SystemConfig.PHOTO_SPLIT_COORD_XY);
						String wh[] = cut[1].split(SystemConfig.PHOTO_SPLIT_COORD_XY);
						if (!Validation.validate(xy[0], Validation.INT)
								|| !Validation.validate(xy[1], Validation.INT)
								|| !Validation.validate(wh[0], Validation.INT)
								|| !Validation.validate(wh[1], Validation.INT)) {
							map.put("success", validate);
							map.put("msg", "裁剪参数不正确 ["+item+"]");
							return map;
						}
						int x = Integer.valueOf(xy[0]);
						int y = Integer.valueOf(xy[1]);
						int w = Integer.valueOf(wh[0]) - x;
						int h = Integer.valueOf(wh[1]) - y;
						if(w<=0 || h<=0) {
							map.put("success", validate);
							map.put("msg", "裁剪参数不正确 ["+item+"]");
							return map;
						}
					} else {
						map.put("success", validate);
						map.put("msg", "参数格式不正确");
						return map;
					}
				}
			}
			validate=true;
			msg="校验成功";
		}else{
			msg="找不到对应文件类型！";
		}
		map.put("success", validate);
		map.put("msg", msg);
		return map;
	};

}

